import threading


class Singleton(object):
    # 加锁以防止多线程环境下多个线程同时创建实例。
    _instance_lock = threading.Lock()

    def __new__(cls, *args, **kwargs):
        if not hasattr(cls, '__instance'):  # 用来避免不必要的加锁。当实例已经创建时，不会进入锁定区域，提高性能。
            with Singleton._instance_lock:
                if not hasattr(cls, '__instance'):  # 二次检查，避免多线程下重复创建,确保在加锁之后，再次确认是否有其他线程已经创建了实例。如果没有创建实例，那么才会执行创建实例的代码。
                    setattr(cls, '__instance', super().__new__(cls))
        return getattr(cls, '__instance')
